//
//  ViewController.m
//  SessionTask
//
//  Created by 马滕亚 on 2020/4/4.
//  Copyright © 2020 M.Y.A. All rights reserved.
//

#import "ViewController.h"
#import "SSZipArchive.h"

@interface ViewController ()<NSURLSessionDownloadDelegate>
/** 全局的网络会话，管理所有的网络任务 */
@property (nonatomic, strong) NSURLSession *session;

/** 全局下载任务 */
@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;
/** 续传的数据 （下载了多少） */
@property (nonatomic, strong) NSData *resumeData;


@end

@implementation ViewController

- (NSURLSession *)session {
    if (_session == nil) {
        // config 提供一个全局的网络配置环境，包括：身份验证、浏览器类型、cookie、缓存、超时
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    }
    
    return _session;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // 1、URL
//    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/面试题.zip"];
    
    NSString *urlStr = @"http://127.0.0.1/面试题.zip";
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:urlStr];
    
//    [self taskWith:url];
    
    [[self.session downloadTaskWithURL:url] resume];

    
//    [self downLoadWith:url];
    
}

// 开始
- (IBAction)startAction:(id)sender {
    NSString *str = @"http://127.0.0.1/面试题.zip";
    NSString *urlStr = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:urlStr];
    self.downloadTask = [self.session downloadTaskWithURL:url];
    [self.downloadTask resume];
    NSLog(@"开始");
}

// 暂停
- (IBAction)pauseAction:(id)sender {
    NSLog(@"暂停");
    [self.downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
        // resumeData : 续传的数据（下载了多少）
        NSLog(@"%tu", resumeData.length);
        
        self.resumeData = resumeData;
        
        // 释放下载任务 （不重复暂停）
        self.downloadTask = nil;
        
    }];
}

// 继续
- (IBAction)resumeAction:(id)sender {
    if (self.resumeData == nil) {
        NSLog(@"没有暂停任务");

        return;
    }
    NSLog(@"继续");

    // 所有的任务都是由session发起的
    // 使用续传数据启动下载f任务
    self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
    // 清空续传数据
    self.resumeData = nil;
    [self.downloadTask resume];

}

- (void)downLoadWith:(NSURL *)url {
    // 2、NSURLSession
//    NSURLSession *session = [NSURLSession sharedSession];
    
    // 3、NSURLSessionDataTask
    /**
     如果在回调方法中 不做任何处理 下载的文件会被删除
     下载的文件放在temp里面的！系统会自动回收这块区域
     
     目的：
     通常从网络上下载文件，zip 文件格式居多 可以为用户节约流量
     
     如果是zip包，下载之后 需要解压
     
     解压缩之后 原始的zip 文件就不需要了，系统会自动帮我们删除
     */
    
//    // 如果要更进下载进度，不能使用Block的回调方式
//    NSURLSessionDownloadTask *task = [self.session downloadTaskWithURL:url completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//        NSLog(@"%@",location);
//        // 下载结束，解压到目标路径
//        NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
//        [SSZipArchive unzipFileAtPath:location.path toDestination:cachePath];
//
//    }];
    
//    // 4、启动任务
//    [task resume];
    
    [[self.session downloadTaskWithURL:url] resume];

}

#pragma mark - <NSURLSessionDownloadDelegate>

//
- (void)URLSession:(NSURLSession *)session downloadTask:(nonnull NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(nonnull NSURL *)location {
    
}


// 下载进度
/**
 * session
 * downloadTask               调用代理方式的下载任务
 * bytesWritten               本次下载的字节数
 * totalBytesWritten          已经下载的字节数
 * totalBytesExpectedToWrite  期望下载的字节数--> 文件总大小
 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
             didWriteData:(int64_t)bytesWritten
        totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    CGFloat progress = (CGFloat)totalBytesWritten / totalBytesExpectedToWrite;
    NSLog(@"%f",progress);
    dispatch_async(dispatch_get_main_queue(), ^{
        self.progressView.progress = progress;
    });
}

// 断点续传
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
 didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes {
    
}


- (void)taskWith:(NSURL *)url {
    // 2、NSURLSession
    NSURLSession *session = [NSURLSession sharedSession];
    
    // 3、NSURLSessionDataTask
    NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 反序列化
        id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"%@",result);
    }];
    
    // 4、启动任务
    [task resume];
}


@end
